该内容已被发布者删除 该内容被自由微信恢复
文章于 2022年7月2日 被检测为删除。
查看原文
被用户删除
其他

Java8 Stream流递归,几行代码搞定遍历树形结构

点击关注 👉 鸭哥聊Java 2022-07-01

大家好,我是鸭哥。


可能平常会遇到一些需求,比如构建菜单,构建树形结构,数据库一般就使用父id来表示,为了降低数据库的查询压力,我们可以使用Java8中的Stream流一次性把数据查出来,然后通过流式处理,我们一起来看看,代码实现为了实现简单,就模拟查看数据库所有数据到List里面。


实体类:Menu.java


/** * Menu * @author lcry */@Data@Builderpublic class Menu {
    /**     * id     */ public Integer id;
    /**     * 名称     */ public String name;
    /**     * 父id ,根节点为0 */    public Integer parentId;
    /**     * 子节点信息     */ public List<Menu> childList;
    public Menu(Integer id, String name, Integer parentId) {        this.id = id;        this.name = name;        this.parentId = parentId; }
    public Menu(Integer id, String name, Integer parentId, List<Menu> childList) {        this.id = id;        this.name = name;        this.parentId = parentId;        this.childList = childList;    }}


递归组装树形结构:


@Testpublic void testtree(){    //模拟从数据库查询出来    List<Menu> menus = Arrays.asList(            new Menu(1,"根节点",0),            new Menu(2,"子节点1",1),            new Menu(3,"子节点1.1",2),            new Menu(4,"子节点1.2",2),            new Menu(5,"根节点1.3",2),            new Menu(6,"根节点2",1),            new Menu(7,"根节点2.1",6),            new Menu(8,"根节点2.2",6),            new Menu(9,"根节点2.2.1",7),            new Menu(10,"根节点2.2.2",7),            new Menu(11,"根节点3",1),            new Menu(12,"根节点3.1",11)    );
    //获取父节点    List<Menu> collect = menus.stream().filter(m -> m.getParentId() == 0).map(            (m) -> {                m.setChildList(getChildrens(m, menus));                return m;            }    ).collect(Collectors.toList());    System.out.println("-------转json输出结果-------");    System.out.println(JSON.toJSON(collect));}/** * 递归查询子节点 * @param root  根节点 * @param all   所有节点 * @return 根节点信息 */private List<Menu> getChildrens(Menu root, List<Menu> all) {    List<Menu> children = all.stream().filter(m -> {        return Objects.equals(m.getParentId(), root.getId());    }).map(            (m) -> {                m.setChildList(getChildrens(m, all));                return m;            }    ).collect(Collectors.toList());    return children;}

格式化打印结果:


来源:blog.csdn.net/qq_19244927/article/details/106481777/



程序员技术交流群
有不少同学给鸭哥说,现在进大厂太难了!赚钱太难!因此,鸭哥特意邀请了华为、腾讯、阿里的朋友进群,与大家一起交流经验,一起增长技术。
有兴趣入群的同学,可长按扫描下方二维码,一定要备注:城市+昵称+技术方向,根据格式备注,可更快被通过且邀请进群。
▲长按扫描

近期技术热文
1、再也不续费了,免费的 SSH 工具更好用!
2、程序员,太卷了!!!
3、到底如何保证线程安全,你真的清楚吗?
4、快手二面:引入RabbitMQ后,你如何保证全链路数据100%不丢失?
点击下方公众号
回复关键字【666
领取资料


我就知道你会点赞+“在看”

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存